package org.review.datastructure;

import java.util.Arrays;

/**
 * 稀疏矩阵复习
 *  step1   需要将稀疏矩阵遍历并记录元素数量
 *  step2   创建一个元素数量加一的二位数组
 *  step3   第一行存入稀疏数组的行和列以及元素个数
 *  step4   遍历稀疏矩阵 将非0数据添加到二维数组中 行需要一个辅助变量index，列是固定的0 存入列  1存入行 2 存入元素值
 * 二维数组恢复稀疏矩阵
 *  step1   使用二位数组第一行的列 创建稀疏矩阵
 *  step2   从第二行开始遍历二维数组 将数组的列作为稀疏矩阵的列 行 和数据 如  target[matrix[i][0]][matrix[i][1]] =matrix[i][2];
 */
public class SparseMatrix {

    public static void main(String[] args) {
        int[][] ints = new int[6][6];
        ints[0][1] = 12;
        ints[0][4] = 6;

        ints[1][0] = 3;
        ints[2][3] = 20;

        ints[4][2] = 5;
        ints[5][5] = 18;


        int count = (int) Arrays.stream(ints).count();
        //todo 首先矩阵有多少个元素， 然后创建二维数组 数组长度是稀疏矩阵非0 元素个数+1,首行存矩阵的行和列数
        int[][] matrix = new int[ count+1][3];
        matrix[0][0] = 6;
        matrix[0][1] = 6;
        matrix[0][2] = count;

        int index = 1;
        for (int i = 0; i < ints.length; i++) {
            for (int j = 0; j < ints[i].length; j++) {
                if(0!=ints[i][j]){
                    matrix[index][0] = i;
                    matrix[index][1] = j;
                    matrix[index][2] = ints[i][j];
                    index++;
                }
            }
        }

        System.out.println("稀疏矩阵");
        Arrays.stream(matrix).forEach(e-> System.out.println(Arrays.toString(e)));

        System.out.println("将稀疏矩阵还原");

        int[][] target = new int[matrix[0][0]][matrix[0][1]];

        //todo 便利
        for (int i = 1; i < matrix.length; i++) {
            for (int j = 0; j < 3; j++) {
                target[matrix[i][0]][matrix[i][1]] =matrix[i][2];
            }
        }
        Arrays.stream(target).forEach(e-> System.out.println(Arrays.toString(e)));
    }

}
